<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="InRFG" id="InRFG"><span data-lake-id="u1843ede1" id="u1843ede1">典型回答</span></h1>
  <p data-lake-id="u89ee13dc" id="u89ee13dc"><br></p>
  <p data-lake-id="u19354d23" id="u19354d23"><span data-lake-id="ube89a79b" id="ube89a79b">Kafka 的重平衡机制是指在消费者组中新增或删除消费者时，Kafka 集群会重新分配主题分区给各个消费者，以保证每个消费者消费的分区数量尽可能均衡。</span></p>
  <p data-lake-id="u7a3b4d96" id="u7a3b4d96"><span data-lake-id="u9e67e902" id="u9e67e902">​</span><br></p>
  <p data-lake-id="u584d7b23" id="u584d7b23"><span data-lake-id="u06b740e0" id="u06b740e0">重平衡机制的目的是实现消费者的负载均衡和高可用性，以确保每个消费者都能够按照预期的方式消费到消息。</span></p>
  <p data-lake-id="u949083ed" id="u949083ed"><span data-lake-id="uf9b64689" id="uf9b64689">​</span><br></p>
  <p data-lake-id="uc73baa2d" id="uc73baa2d"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1678605797572-80a61f6e-b9d6-4d55-9f43-d0f2bd28af12.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_103%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u94613703" id="u94613703"><span data-lake-id="uf6d0632e" id="uf6d0632e">​</span><br></p>
  <p data-lake-id="ud52f7d86" id="ud52f7d86"><strong><span data-lake-id="uf8d8fbb8" id="uf8d8fbb8">重平衡的 3 个触发条件：</span></strong></p>
  <p data-lake-id="u78cc686f" id="u78cc686f"><span data-lake-id="ubfb2f829" id="ubfb2f829">​</span><br></p>
  <ul list="u4a2ee020">
   <li fid="ueb2b8349" data-lake-id="u665cd35b" id="u665cd35b"><span data-lake-id="ucefada7a" id="ucefada7a">消费者组成员数量发生变化。</span></li>
   <li fid="ueb2b8349" data-lake-id="u0b984c1c" id="u0b984c1c"><span data-lake-id="u0f736b49" id="u0f736b49">订阅主题数量发生变化。</span></li>
   <li fid="ueb2b8349" data-lake-id="u1474cd0f" id="u1474cd0f"><span data-lake-id="u8cb48c17" id="u8cb48c17">订阅主题的分区数发生变化。</span></li>
  </ul>
  <p data-lake-id="u4ce230e0" id="u4ce230e0"><span data-lake-id="u196496d8" id="u196496d8">​</span><br></p>
  <p data-lake-id="ua8642987" id="ua8642987"><span data-lake-id="ud18beb6f" id="ud18beb6f">当Kafka 集群要触发重平衡机制时，大致的步骤如下：</span></p>
  <p data-lake-id="u0e75ba90" id="u0e75ba90"><span data-lake-id="ua8272648" id="ua8272648">​</span><br></p>
  <ol list="ubc7dcdc7">
   <li fid="ue7ed6280" data-lake-id="uabfb140c" id="uabfb140c"><strong><span data-lake-id="uda0b7972" id="uda0b7972">暂停消费</span></strong><span data-lake-id="uc356ee70" id="uc356ee70">：在重平衡开始之前，Kafka 会暂停所有消费者的拉取操作，以确保不会出现重平衡期间的消息丢失或重复消费。</span></li>
  </ol>
  <p data-lake-id="u915f7659" id="u915f7659"><br></p>
  <ol list="ubc7dcdc7" start="2">
   <li fid="ue7ed6280" data-lake-id="u231954a3" id="u231954a3"><strong><span data-lake-id="u10013d1b" id="u10013d1b">计算分区分配方案</span></strong><span data-lake-id="u7a75fdc6" id="u7a75fdc6">：Kafka 集群会根据当前消费者组的消费者数量和主题分区数量，计算出每个消费者应该分配的分区列表，以实现分区的负载均衡。</span></li>
  </ol>
  <p data-lake-id="u6dac346c" id="u6dac346c"><br></p>
  <ol list="ubc7dcdc7" start="3">
   <li fid="ue7ed6280" data-lake-id="u596ce17d" id="u596ce17d"><strong><span data-lake-id="u1c30a1c0" id="u1c30a1c0">通知消费者</span></strong><span data-lake-id="ub553ced1" id="ub553ced1">：一旦分区分配方案确定，Kafka 集群会将分配方案发送给每个消费者，告诉它们需要消费的分区列表，并请求它们重新加入消费者组。</span></li>
  </ol>
  <p data-lake-id="u0892091c" id="u0892091c"><br></p>
  <ol list="ubc7dcdc7" start="4">
   <li fid="ue7ed6280" data-lake-id="u389ddeaa" id="u389ddeaa"><strong><span data-lake-id="ue611d1c0" id="ue611d1c0">重新分配分区</span></strong><span data-lake-id="ucbb3b3ad" id="ucbb3b3ad">：在消费者重新加入消费者组后，Kafka 集群会将分区分配方案应用到实际的分区分配中，重新分配主题分区给各个消费者。</span></li>
  </ol>
  <p data-lake-id="ud489f964" id="ud489f964"><br></p>
  <ol list="ubc7dcdc7" start="5">
   <li fid="ue7ed6280" data-lake-id="uf71d5517" id="uf71d5517"><strong><span data-lake-id="u59cee05b" id="u59cee05b">恢复消费</span></strong><span data-lake-id="u34dacb4f" id="u34dacb4f">：最后，Kafka 会恢复所有消费者的拉取操作，允许它们消费分配给自己的分区。</span></li>
  </ol>
  <p data-lake-id="uf938ffca" id="uf938ffca"><span data-lake-id="ue2c604dd" id="ue2c604dd">​</span><br></p>
  <p data-lake-id="u0b18993c" id="u0b18993c"><span data-lake-id="u25f8198f" id="u25f8198f">Kafka 的重平衡机制能够有效地实现消费者的负载均衡和高可用性，提高消息的处理能力和可靠性。但是，由于重平衡会带来一定的性能开销和不确定性，因此在设计应用时需要考虑到重平衡的影响，并采取一些措施来降低重平衡的频率和影响。</span></p>
  <p data-lake-id="u25d9e6f9" id="u25d9e6f9"><br></p>
  <p data-lake-id="uc781489d" id="uc781489d"><strong><span data-lake-id="u49b643d0" id="u49b643d0">在重平衡过程中，所有 Consumer 实例都会停止消费，等待重平衡完成。但是目前并没有什么好的办法来解决重平衡带来的STW，只能尽量避免它的发生。</span></strong></p>
  <p data-lake-id="ucc14c86b" id="ucc14c86b"><strong><span data-lake-id="u40ac0a13" id="u40ac0a13">​</span></strong><br></p>
  <p data-lake-id="u41c65dc7" id="u41c65dc7"><strong><span data-lake-id="u9e53d1bc" id="u9e53d1bc">​</span></strong><br></p>
  <h1 data-lake-id="zzhz5" id="zzhz5"><span data-lake-id="uddd58af0" id="uddd58af0">扩展知识</span></h1>
  <p data-lake-id="u957aaf9a" id="u957aaf9a"><br></p>
  <h2 data-lake-id="sz6kB" id="sz6kB"><span data-lake-id="u03ac7fc6" id="u03ac7fc6">消费者的五种状态</span></h2>
  <p data-lake-id="u0792cd3b" id="u0792cd3b"><br></p>
  <p data-lake-id="u1d45b48b" id="u1d45b48b"><span data-lake-id="u7d59921a" id="u7d59921a">Kafka的Consumer实例五种状态，分别是：</span></p>
  <p data-lake-id="u116fd2f1" id="u116fd2f1"><span data-lake-id="u20b2a20a" id="u20b2a20a">​</span><br></p>
  <p data-lake-id="u7d0e899e" id="u7d0e899e"><span data-lake-id="ub15fc2ce" id="ub15fc2ce">​</span><br></p>
  <table data-lake-id="C2pDD" id="C2pDD" margin="true" width-mode="contain" class="lake-table" style="width: 751px">
   <colgroup>
    <col width="250">
    <col width="501">
   </colgroup>
   <tbody>
    <tr data-lake-id="u35a2546d" id="u35a2546d">
     <td data-lake-id="u317a4716" id="u317a4716">
      <p data-lake-id="ue9ee18fd" id="ue9ee18fd"><span data-lake-id="ue7a8762b" id="ue7a8762b">状态</span></p></td>
     <td data-lake-id="ue35b4a54" id="ue35b4a54">
      <p data-lake-id="u6b94e9c9" id="u6b94e9c9"><span data-lake-id="u245ef63c" id="u245ef63c">描述</span></p></td>
    </tr>
    <tr data-lake-id="u868d8801" id="u868d8801">
     <td data-lake-id="u598a4f67" id="u598a4f67">
      <p data-lake-id="u8905322b" id="u8905322b"><span data-lake-id="u1077f891" id="u1077f891">Empty</span></p></td>
     <td data-lake-id="ud44c6e87" id="ud44c6e87">
      <p data-lake-id="uedf73c65" id="uedf73c65"><span data-lake-id="u075f2cd4" id="u075f2cd4">组内没有任何成员，但是消费者可能存在已提交的位移数据，而且这些位移尚未过期</span></p></td>
    </tr>
    <tr data-lake-id="u1ea3554a" id="u1ea3554a">
     <td data-lake-id="u0148144b" id="u0148144b">
      <p data-lake-id="ua349c97f" id="ua349c97f"><span data-lake-id="ube6caba2" id="ube6caba2">Dead</span></p></td>
     <td data-lake-id="u7baa256d" id="u7baa256d">
      <p data-lake-id="u2aa985b4" id="u2aa985b4"><span data-lake-id="uf68d461b" id="uf68d461b">同样是组内没有任何成员，但是组的元数据信息已经被协调者端移除，协调者保存着当前向他注册过的所有组信息</span></p></td>
    </tr>
    <tr data-lake-id="u3f96dfd3" id="u3f96dfd3">
     <td data-lake-id="ub74c8590" id="ub74c8590">
      <p data-lake-id="u8b2e71b5" id="u8b2e71b5"><span data-lake-id="ub226ded7" id="ub226ded7">PreparingRebalance</span></p></td>
     <td data-lake-id="u6c422c55" id="u6c422c55">
      <p data-lake-id="u0bf3e234" id="u0bf3e234"><span data-lake-id="uaa7698f6" id="uaa7698f6">消费者组准备开启重平衡，此时所有成员都需要重新加入消费者组</span></p></td>
    </tr>
    <tr data-lake-id="ud3ae216e" id="ud3ae216e">
     <td data-lake-id="u57d42256" id="u57d42256">
      <p data-lake-id="u655306d3" id="u655306d3"><span data-lake-id="u01583395" id="u01583395">CompletingRebalance</span></p></td>
     <td data-lake-id="ud99d46ca" id="ud99d46ca">
      <p data-lake-id="ue470e5ae" id="ue470e5ae"><span data-lake-id="ub854cc75" id="ub854cc75">消费者组下所有成员已经加入，各个成员中等待分配方案</span></p></td>
    </tr>
    <tr data-lake-id="uc5a3004d" id="uc5a3004d">
     <td data-lake-id="uee5f7f1e" id="uee5f7f1e">
      <p data-lake-id="u8d798a37" id="u8d798a37"><span data-lake-id="u4eb7293e" id="u4eb7293e">Stable</span></p></td>
     <td data-lake-id="u97523657" id="u97523657">
      <p data-lake-id="uc5fcf772" id="uc5fcf772"><span data-lake-id="ue100dec3" id="ue100dec3">消费者组的稳定状态，该状态表明重平衡已经完成，组内成员能够正常消费数据</span></p></td>
    </tr>
   </tbody>
  </table>
  <p data-lake-id="u7542e4af" id="u7542e4af"><span data-lake-id="u0c557747" id="u0c557747">状态的流转过程：</span></p>
  <p data-lake-id="udc0405c6" id="udc0405c6"><span data-lake-id="ua78872d3" id="ua78872d3">​</span><br></p>
  <p data-lake-id="u5e70f518" id="u5e70f518"><span data-lake-id="ue9a864c0" id="ue9a864c0">​</span><br></p>
  <p data-lake-id="u9148fb17" id="u9148fb17"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1678606209834-a484dcf7-dece-4eb1-988b-17ff3affcc5f.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_102%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
 </body>
</html>